package com.sg.fileService.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.sg.common.exception.BaseBusinessException;
import com.sg.fileService.service.IFileDownloadService;

/** 
 * 代码优化：需要重构，将图片，视频，音频，文件，全部分离进行操作，创建操作基类，不同文件类型实现不同的操作方式
 * 文件下载Controller,提供文件路径下载和文件ID下载两种方式，并且只有文件ID下载方式提供restful接口。<br/>
 * 图片文件比较特殊所以提供单独接口，1、如果使用非图片文件接口下载图片文件，
 * 									a、在非转换模式下（image.encoder.enable=false），只能下载源文件，不提供缩放（fileType）和文件格式（tranType）的转换。<br/>
 * 									b、转换模式下（image.encoder.enable=true）,可以下载不同缩放（fileType）的文件，但不提供文件格式（tranType）的转换下载。<br/>
 *                        2、图片文件下载接口下载图片，可以根据文件格式（tranType），缩放类型（fileType），进行不同缩放和格式的文件的下载（无需考虑转换模式是否开关，此接口针对文件格式转换和比例缩放为实时转换）<br/>。 
 * ClassName:FileDownloadController <br/>
 * Date:     2018年1月29日 下午11:00:00 <br/>  	 
 * Update：      20180224 
 * @author   xzk   
 * @version    
 * @since    JDK 1.8  
 * @see        
 */
@CrossOrigin
@RequestMapping("/file")
@RestController
public class FileDownloadController {
	@Autowired
	private IFileDownloadService fileDownloadService;
	
	/**
	 * 根据文件的相对路径下载文件
	 * @param request
	 * @param response
	 * @param filePath
	 * 			文件的相对路径
	 * @param fileType
	 * 			文件尺寸类型，此参数为约定参数，可在fileUploadConfig.properties中配置</br>
	 * 			一旦配置成功后尽量不要修改
	 *          默认类型有: 
	 *          			o  -  原始文件
	 *      			    t  -  缩略图(视频和图片有此类型)
	 *      			    s  -  小尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为小尺寸后，
	 *                                  视频和图片的小尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比小尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    m  -  中等尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为中等尺寸后，
	 *                                  视频和图片的中等尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比中等尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    l  -  原始寸默认转换格式后的文件
	 *      							(如视频上传为avi格式，则会按照原尺寸转换为MP4格式存放在此处)
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping(value="/downloadByPath",method={RequestMethod.POST,RequestMethod.GET})
	public void downloadByPath(HttpServletRequest request,HttpServletResponse response
			,@RequestParam(value="filePath",required=false)String filePath
			,@RequestParam(value="fileType",required=false)String fileType
			,@RequestParam(value="tranType",required=false)String tranType)throws BaseBusinessException{  
		
		if(StringUtils.isEmpty(tranType)) {
			fileDownloadService.downloadFileByPath(response, filePath,fileType);
		}
		fileDownloadService.transcoingAndDownloadImgByPath(response, filePath,fileType,tranType);
	}
	/**
	 * 根据文件的Id下载文件
	 * @param request
	 * @param response
	 * @param fileId
	 * 			文件Id
	 * @param fileType
	 * 			文件尺寸类型，此参数为约定参数，可在fileUploadConfig.properties中配置</br>
	 * 			一旦配置成功后尽量不要修改
	 *          默认类型有: 
	 *          			o  -  原始文件
	 *      			    t  -  缩略图(视频和图片有此类型)
	 *      			    s  -  小尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为小尺寸后，
	 *                                  视频和图片的小尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比小尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    m  -  中等尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为中等尺寸后，
	 *                                  视频和图片的中等尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比中等尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    l  -  原始寸默认转换格式后的文件
	 *      							(如视频上传为avi格式，则会按照原尺寸转换为MP4格式存放在此处)
	 * @param tranType
	 * 			转换类型
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping(value="/downloadById",method={RequestMethod.POST,RequestMethod.GET})
	public void downloadById(HttpServletRequest request,HttpServletResponse response
			,@RequestParam(value="fileId",required=false)String fileId
			,@RequestParam(value="fileType",required=false)String fileType
			,@RequestParam(value="tranType",required=false)String tranType)throws BaseBusinessException{
		if(StringUtils.isEmpty(tranType)) {
			fileDownloadService.downloadFileById(response, fileId,fileType);
		}
		fileDownloadService.transcoingAndDownloadImgById(response,fileId,fileType,tranType);
		
	}
	
	/**
	 * 根据文件的Id下载文件（Rest风格）
	 * @param request
	 * @param response
	 * @param fileId
	 * 			文件Id
	 * @param fileType
	 * 			文件尺寸类型，此参数为约定参数，可在fileUploadConfig.properties中配置</br>
	 * 			一旦配置成功后尽量不要修改
	 *          默认类型有: 
	 *          			o  -  原始文件
	 *      			    t  -  缩略图(视频和图片有此类型)
	 *      			    s  -  小尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为小尺寸后，
	 *                                  视频和图片的小尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比小尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    m  -  中等尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为中等尺寸后，
	 *                                  视频和图片的中等尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比中等尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    l  -  原始寸默认转换格式后的文件
	 *      							(如视频上传为avi格式，则会按照原尺寸转换为MP4格式存放在此处)
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping(value= {"/rest/downloadById/{fileType}/{fileId}",
							"/rest/{fileType}/{fileId}"},method={RequestMethod.GET})
	public void restDownloadById(HttpServletRequest request,HttpServletResponse response
			,@PathVariable("fileId")String fileId
			,@PathVariable("fileType")String fileType)throws BaseBusinessException{  
		fileDownloadService.downloadFileById(response, fileId,fileType);
	}
	
	
	/**
	 * 根据图片文件的Id下载文件（Rest风格）
	 * @param request
	 * @param response
	 * @param fileId
	 * 			文件Id
	 * @param fileType
	 * 			文件尺寸类型，此参数为约定参数，可在fileUploadConfig.properties中配置</br>
	 * 			一旦配置成功后尽量不要修改
	 *          默认类型有: 
	 *          			o  -  原始文件
	 *      			    t  -  缩略图(视频和图片有此类型)
	 *      			    s  -  小尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为小尺寸后，
	 *                                  视频和图片的小尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比小尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    m  -  中等尺寸(此尺寸为自定义尺寸，
	 *      							一旦定义为中等尺寸后，
	 *                                  视频和图片的中等尺寸则会按此尺寸压缩，
	 *                                  如果原尺寸比中等尺寸还小，那么则会放大为此尺寸的像素)
	 *      			    l  -  原始寸默认转换格式后的文件
	 *      							(如视频上传为avi格式，则会按照原尺寸转换为MP4格式存放在此处)
	 * @param tranType
	 * 			转换类型
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping(value= {"/rest/img/{fileId}/{fileType}/{tranType}"},method={RequestMethod.GET})
	public void restTransCodingAndDownloadImgById(HttpServletRequest request,HttpServletResponse response
			,@PathVariable("fileId")String fileId
			,@PathVariable("fileType")String fileType
			,@PathVariable("tranType")String tranType)throws BaseBusinessException{  
		fileDownloadService.transcoingAndDownloadImgById(response, fileId,fileType,tranType);
	}
}
